home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / c_news / 11 / cnews011.nws next >
Text File  |  1988-09-09  |  64KB  |  1,781 lines

  1.  
  2.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  3.  
  4.  
  5.         *-------------------------------------------------------------*
  6.         |  C  NEWS - International C Newsletter, Compiler review, and |
  7.         |  tutorial.                                                  |
  8.         *-------------------------------------------------------------*
  9.  
  10.  
  11.         Table of Contents
  12.  
  13.         The Heap: Messages from the Editor  ..........................2
  14.         by Barry Lynch
  15.  
  16.         Memory Models  ...............................................4
  17.         by Bill Mayne
  18.  
  19.         Public  Domain Software Review ..............................20
  20.         by Barry Lynch (ROFF)
  21.  
  22.         C Software from the C BBS  ..................................21
  23.         by Arnold Cherdak (FILECHK)
  24.  
  25.         Article Submission Standards ................................23
  26.  
  27.         Address's ...................................................24
  28.  
  29.         Index .......................................................25
  30.  
  31.         Distribution Points .........................................27
  32.  
  33.         User Response Form ..........................................28
  34.  
  35.  
  36.              C News is an electronic journal published by the C BBS  in
  37.         Burke, VA  on a monthly basis.  The subject for C News is the C
  38.         programming language, as well  as  any  derivatives  like  C++.
  39.         All  readers  are  encouraged  to  submit articles, reviews, or
  40.         comments for submission.  C News  is  freely  distributed,  but
  41.         can  not be sold for a profit, or cannot have a charge assessed
  42.         to cover distribution costs.  To do so is in  direct  violation
  43.         of the  License  agreement.  Copies of which are available from
  44.         the C  BBS.    This  publication  is  Copyrighted   under   U.S
  45.         Copyright Law.
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.                                     Page  1
  65.  
  66.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  67.  
  68.  
  69.         The HEAP:  Messages from the Editor by Barry Lynch
  70.  
  71.             Well,  I  am  back after 10 days in the wilds of Canada, no
  72.         computers, sports or work to worry about.  I  highly  recommend
  73.         that everyone  take  time  off from there work and hobbies.  It
  74.         is amazing what a little fresh air can do for the mind.
  75.  
  76.  
  77.         LACK OF FEEDBACK
  78.  
  79.             While I was away I spent some  time  pondering  the  future
  80.         and status of  "C  News".   One of the problems that I see:  is
  81.         the lack of feedback on  the  articles  and  reviews  contained
  82.         within C  News.   Numerous individuals have spent hours writing
  83.         code, and an accompanying article for no financial reward.   Is
  84.         it  too  much to ask, to fill out the questionnaire and send it
  85.         in?   And  if  you  have  questions  about  some  of  the  code
  86.         included, why not take the time to ask the author?
  87.  
  88.             C  News  is  for you the reader, but it will not survive if
  89.         the communication is not two-way.  I think that  I  can  safely
  90.         say  that  some of the authors are a little miffed at why there
  91.         has not been any feedback. Please, take the time to offer  some
  92.         comments.
  93.  
  94.             Which brings  me  to another point:  Letters to the Editor.
  95.         At both of the C BBS Users meetings held to date, a  suggestion
  96.         has  been  placed  on  the  table  regarding  a "Letters to the
  97.         Editor" column for C News.  I agree that it  would  be  a  good
  98.         idea, but  once  again  no letters.  Let's at least see one per
  99.         issue!!  <Or do I have to resort to "Creating" mail to start  a
  100.         column!!>
  101.  
  102.             While  we  are  on  the  subject  of  writing  and  lack of
  103.         feedback.  One of the individuals that has taken  the  time  to
  104.         write for C  News is:  Bill Mayne.  Bill currently has the lead
  105.         article in C news this month on memory models.  Bill  also  has
  106.         an article  in the September issue of "Computer Language".  The
  107.         article is called:  To Parse or not Parse.  Bill  explores  the
  108.         use of  the  main()  command  line arguments.  If you can, take
  109.         the time to  read  the  article  and  offer  Bill  comments  or
  110.         congratulations on  a  job  well  done.  Bill is a regular user
  111.         here at the C BBS,  and  answers  mail  left  to  him  as  time
  112.         permits.
  113.  
  114.             Another  user  that  has  taken  the time to write is Arnie
  115.         Cherdak.  Arnie wrote the article on Database's in C  in  Issue
  116.         10.   The  article  was  written  to  be used as an interactive
  117.         tutorial.  Exercises were included, with  the  intended  result
  118.         of readers  sending in the code they wrote.  To date no one has
  119.         commented on the article or shown any code.  Once  again,  lack
  120.         of feedback.
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.                                     Page  2
  129.  
  130.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  131.  
  132.  
  133.         ROFF
  134.  
  135.             Well  that  is  all  for  now  on the subject of feedback I
  136.         think I have made my point.  You may notice that C News  has  a
  137.         new format  beginning  with  this issue.  I have started to use
  138.         ROFF, a PC based version of  the  UNIX  Roff  utility.    As  I
  139.         become  more  familiar with the software, the format may change
  140.         yet again.  The goal is to have an  automatic  C  News  or  any
  141.         newsletter for  matter  -  generator.    Roff  is  part  of the
  142.         answer, and some additional code is needed.  Suffice it to  say
  143.         that  the  use  of  Roff will provide a neater end product, and
  144.         free up more of my time for editing and writing.  If anyone  is
  145.         interested  in Roff, I have two versions of the program here on
  146.         the C BBS.    See  Public  Domain  Software  Reviews  for  more
  147.         information.
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.                                     Page  3
  194.  
  195.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  196.  
  197.  
  198.         CHOOSING A MEMORY MODEL by Bill Mayne
  199.  
  200.         ABSTRACT:   The  meaning  of  the  "near",  "far",  and  "huge"
  201.         keywords specifying pointer types and how these are related  to
  202.         the  various memory models available to C programmers using the
  203.         80x86 family of processors used in IBM and compatible  PCs  and
  204.         their successors  is  explained.    A  simple  bench mark which
  205.         illustrates the affect of memory model selection on  code  size
  206.         and execution  time  is shown.  Coding examples show how to use
  207.         preprocessor symbols and the  #if  directive  to  handle  cases
  208.         where  source  code must be modified according the memory model
  209.         in use.  The compilers used are Microsoft C (MSC) versions  4.0
  210.         and 5.0 and Turbo C version 1.5.
  211.  
  212.              Based  on  an  understanding  of  pointer types and memory
  213.         models, confirmed by the results of the bench  mark  guidelines
  214.         for  the  selection  of the best memory model for a program are
  215.         given.
  216.  
  217.         ACKNOWLEDGEMENT:   Thanks  to  Jerry   Zeisler,   who   sparked
  218.         interest  in the subject of this article in a "conversation" on
  219.         the C BBS and helped with the  bench  mark  by  compiling  them
  220.         with Turbo  C.    Thanks  also  to Barry Lynch, editor of the C
  221.         News and sysop of the C BBS for his  encouragement,  assistance
  222.         with  file transfers, and running a fine BBS for the discussion
  223.         of C related issues.
  224.  
  225.         1. INTRODUCTION
  226.  
  227.              The use of the "near", "far",  and  "huge"  keywords  when
  228.         declaring  pointers  and  the selection of a memory model for a
  229.         program written in C is a problem unique to  the  80x86  family
  230.         of  processors  because these are related to the segment:offset
  231.         addressing scheme  used   in   this   architecture.      Before
  232.         discussing  the  advantages  and  disadvantages  of the various
  233.         options available,  it  is  useful  to  briefly  describe  this
  234.         scheme   for  those  not  already  familiar  with  the  machine
  235.         language of  the  80x86  architecture.      Experienced   80x86
  236.         programmers  may  wish  to skip section 1.1, which explains the
  237.         various types of  pointers,  and  go  directly  to  1.2,  which
  238.         explains memory  models.   All of the information from sections
  239.         1.1 and 1.2 except a few historical asides and  other  comments
  240.         is in the Microsoft C User's Guide.
  241.  
  242.         1.1 80x86 Addresses and Pointer Types
  243.  
  244.              The  80x86 family of processors used in IBM and compatible
  245.         PCs are 16 bit processors which are descendents of the 8080  or
  246.         its spin-off,  the Z80 used in earlier CP/M machines.  A 16-bit
  247.         machine is  so  called  because  its  word  size  is  16  bits.
  248.         Usually,  but  not  always,  the  size  of a pointer, word, and
  249.         integer are  the  same.    The  80x86  family  is  one  of  the
  250.         exceptions.   A 16 bit word can hold only 2**16 or 64K distinct
  251.         addresses.  In 80x86 processors, as in  most  micros  and  many
  252.         larger  processors,  the  unit  of  memory addressed is a byte.
  253.  
  254.  
  255.  
  256.  
  257.  
  258.                                     Page  4
  259.  
  260.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  261.  
  262.  
  263.         The address of  larger  units  like  words  are  given  by  the
  264.         address  of  their  first  byte, which may be required to be on
  265.         certain  boundaries  such  as  even   numbered   addresses   or
  266.         multiples of  the  word  size.    (There are machines which use
  267.         word addressing.     This   has   advantages   especially   for
  268.         scientific/engineering "number  crunchers".   It is not so good
  269.         for handling character data.)
  270.  
  271.              When the 8080 and Z80 first  came  out,  memory  was  much
  272.         more  expensive and being able to address 64K was thought to be
  273.         sufficient.  Another consideration was that limiting  addresses
  274.         to  16  bits  made  the  construction  of  memories simpler and
  275.         cheaper, and  early  microprocessors  were  imbedded  in  other
  276.         systems  for  control purposes and did not need so much memory.
  277.         The use of microprocessors for data processing applications  in
  278.         micro computers  came  later.   The term "Personal Computer" or
  279.         PC was not yet in common usage.
  280.  
  281.              As an additional historical note, mainframes of  the  time
  282.         were  designed with much larger address spaces, but still small
  283.         by the standards of today and the near future.    The  IBM  360
  284.         and   370  which  had  32  bit  processors  only  used  24  for
  285.         addressing, limiting addressable memory to 16M even  for  these
  286.         large machines.    Already  some PCs using extended memory have
  287.         that much.  By contrast, IBM mainframes in use today  have  the
  288.         option  of  "extended  architecture"  or  XA, using 31 bits for
  289.         addresses,  and  the  next  wave  called   "Enterprise   System
  290.         Architecture" or  ESA  adds  another 12.  The amount of storage
  291.         which can be addressed by 43 bits is truly  immense,  2**43  or
  292.         about  8.8e12,  more than any main storage we are likely to see
  293.         for a long time.   Even  so,  such  large  address  spaces  are
  294.         actually  useful  since nearly all mainframes have the hardware
  295.         and software to support virtual memory.
  296.  
  297.              When the price of memory came down  and  the  need  for  a
  298.         larger    address    space   became   important,   but   16-bit
  299.         microprocessors were still the norm, designers decided  to  use
  300.         a segmented  memory  architecture.   Segments would contain 64K
  301.         bytes each, so  the  relative  position  of  a  byte  within  a
  302.         segment  could  still  be  represented  by  a  16 bit register.
  303.         Extra registers were  added  to  address  the  segments.    For
  304.         flexibility,  segments  were  allowed  to  start on any 16 byte
  305.         "paragraph" boundary.  The 80x86 has registers  for  addressing
  306.         4 segments.      They   are  CS  ("code  segment"),  DS  ("data
  307.         segment"), SS ("stack  segment"),  and  ES  ("extra  segment").
  308.         The names  reflect  the  way they are normally used.  A segment
  309.         register  gives  the  address  of  the  first  paragraph  of  a
  310.         segment, shifted  right 4 bits to fit within a 16 bit word.  To
  311.         compute an actual address the segment is shifted  left  4  bits
  312.         to  convert  it  to a byte address and then the offset is added
  313.         to address any of the 64K  bytes  within  the  segment.    Most
  314.         programs,  whether  written  in assembly language or a compiled
  315.         language take  advantage  of  the  registers  and  make  things
  316.         cleaner  by putting code, data and stack into separate segments
  317.         addressed by the registers named for those purposes.    (It  is
  318.  
  319.  
  320.  
  321.  
  322.  
  323.                                     Page  5
  324.  
  325.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  326.  
  327.  
  328.         true  that  the  stack  contains data, and for that matter code
  329.         itself is a kind of data,  but  the  conventional  distinctions
  330.         are useful.)
  331.  
  332.              Normally  such details of machine architecture are only of
  333.         concern to the assembly language programmer, but the  processor
  334.         architecture does  influence  part  of  the compiler design.  C
  335.         programmers who wish to understand the reasons for such  design
  336.         decisions  and  in  particular architecture specific details of
  337.         pointer type and memory model need to understand them.
  338.  
  339.              In machine language it  is  very  convenient  if  all  the
  340.         memory  referenced  lies  within  a  segment  whose  address is
  341.         already loaded in the appropriate register.  With  the  segment
  342.         implied,  only  the  16  bits  of  the  offset must actually be
  343.         included in the pointer.  Such a pointer  is  called  a  "near"
  344.         pointer.   If,  on  the other hand, the code or data referenced
  345.         does not all lie within a  64K  segment,  it  is  necessary  to
  346.         specify  the segment as well as the offset, and a "far" pointer
  347.         is required.  This is  significant  not  only  for  space  (far
  348.         pointers   requiring  four  bytes  instead  of  two),  but  for
  349.         performance.   At  the  machine  language  level  use  of   far
  350.         pointers  requires  the  values  of  segment  registers  to  be
  351.         swapped every time a different segment is accessed.   Not  only
  352.         does  an actual pointer take up more space, so does the code to
  353.         manipulate it.    The  extra  instructions  also  increase  the
  354.         execution time.   And this applies not only to explicit pointer
  355.         arithemetic,  but  to  array   references,   sometimes   global
  356.         variable  references and in other situations involving implicit
  357.         address calculations.
  358.  
  359.              Far pointers are used for data when a  program  references
  360.         more  than  64K of data in total, but it is still convenient if
  361.         each array or structure  fits  within  a  segment.    Then  the
  362.         segment  address  used  can  be selected so that the address of
  363.         all elements of the array or structure can be computed  without
  364.         changing the  segment  part  of  the  address.    If  even this
  365.         restriction must be  removed  a  "huge"  pointer  is  required.
  366.         Huge  pointers are four bytes long, just like far pointers, but
  367.         arithmetic  with  huge  pointers  requires  extra  steps   (and
  368.         code).   Both  huge and far pointers follow the rule, common in
  369.         microprocessors, of storing the  least  signicant  byte  first.
  370.         The  first  word  of a far pointer is the offset and the second
  371.         word is the segment.  This is important to  know  if  you  must
  372.         construct  a  far pointer from its components, or decompose one
  373.         into its segment and offset parts.  A macro in Listing 1  shows
  374.         how  to do the former, and the library macros FP_SEG and FP_OFF
  375.         do the latter.  By the way, the segment  and  offset  are  also
  376.         each   stored   least   significant   byte   first,   but   the
  377.         implementation of shifting and arithmetic in  C  take  care  of
  378.         this for you and you don't need to be concerned about it.
  379.  
  380.              Since  offsets  into  code  are  not used in this way, the
  381.         "huge" keyword applies only  to  pointers  to  data,  including
  382.         array names.
  383.  
  384.  
  385.  
  386.  
  387.  
  388.                                     Page  6
  389.  
  390.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  391.  
  392.  
  393.              Assembly  language  programmers must be directly concerned
  394.         with considerations such as those above.   C  programmers  have
  395.         it  a  little  easier, since the C compiler automatically takes
  396.         care of generating addresses and  swapping  segment  registers.
  397.         Still,   the   programmer   concerned  with  efficiency  should
  398.         understand what  is  required  and  control  the  selection  of
  399.         pointer  types  to  produce  the most efficient code compatible
  400.         with  other   goals   such   as   ease   of   programming   and
  401.         maintainability.
  402.  
  403.         1.2 Memory Models
  404.  
  405.              The  term  "memory model" simply refers to the combination
  406.         of defaults for code and  data  pointers.    Though  individual
  407.         pointers  may  be explicitly declared "near", "far", or "huge",
  408.         the memory model used is very important to program design.   It
  409.         partly  determines the amount of code and/or data a program can
  410.         address.  In addition, as the bench mark  in  a  later  section
  411.         shows,  the  selection  of  a  memory  model may have important
  412.         implications for the  size  and  efficiency  of  the  generated
  413.         code.   As  a  rule,  it  is better to use the smallest pointer
  414.         which will work.  Use "near" in preference  to  "far"  and  use
  415.         "huge" only if absolutely necessary.
  416.  
  417.              In  the  small  memory  model,  both the code and data are
  418.         addressed by near pointers.   Small  model  programs  are  thus
  419.         limited  to  a total of 64K of code and 64K or data, or a total
  420.         of 128K.  Most programs fit within this limit, and  it  is  the
  421.         most efficient, so it is the default.
  422.  
  423.              Medium  model  programs use near pointers for data and far
  424.         pointers for code.  They can therefore have only 64K  of  data,
  425.         but  the  amount  of  code is limited only by available memory.
  426.         The medium model is preferred by the integrated environment  of
  427.         Quick  C,  but  is  otherwise  not  often  useful  for hobbyist
  428.         programmers.  It takes a rather large program to exceed 64K  of
  429.         code,  and  most  that  do probably also exceed 64K of data and
  430.         thus need the large or huge model.  However,  since  references
  431.         to  data  are executed much more frequently than far references
  432.         to  code  the  medium  model  does  have  quite  a  performance
  433.         advantage  over  large  in  those  cases  where it does fit the
  434.         requirements.
  435.  
  436.              Compact model programs use far pointers for data and  near
  437.         pointers for  code.    This  model  is  good for programs which
  438.         allocate a lot of data, but which have less than 64K  of  code.
  439.         A  common example would be a simple editor which stores a whole
  440.         file in memory as an array or linked list.
  441.  
  442.              The advantage of the compact model over  the  large  model
  443.         is  usually  less  than the advantage of medium over large, but
  444.         the choice is  almost  always  between  compact  and  large  or
  445.         between  medium  and  large,  hardly  ever  between compact and
  446.         medium.
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.                                     Page  7
  454.  
  455.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  456.  
  457.  
  458.              Large model programs use far pointers for  both  data  and
  459.         code.   They can have any amount of code and/or data which will
  460.         fit in memory, in any combination.   The  only  restriction  is
  461.         that individual arrays or structures cannot exceed 64K.
  462.  
  463.              The  huge  model  uses  far  pointers  for  code  and huge
  464.         pointers for data and is thus restricted only by the amount  of
  465.         storage available.    It  is  also  the least efficient, and is
  466.         rarely needed.
  467.  
  468.              The tiny memory model, which is an  option  with  Turbo  C
  469.         but not  with  Microsoft  is  similar  to small.  Both code and
  470.         data  pointers  are  near  pointers,  but,  in  addition,   all
  471.         segments  are  assumed  to  be the same, that is the total data
  472.         and code is restricted  to  64K.    This  might  yield  smaller
  473.         and/or  faster  code  in  some  cases,  if  the  compiler  took
  474.         advantage of it.  In the  simple  bench  mark  given  below  no
  475.         significant difference was found.
  476.  
  477.              Another   important   design  consideration  is  that  the
  478.         library routines will assume the  default  types  according  to
  479.         the memory  model in use.  Under MSC release 4.0 there is a set
  480.         a  libraries  for   each   memory   model,   and   the   linker
  481.         automatically  selects  the set matching the .OBJ files linked.
  482.         MSC 5.0 may be installed with  combined  libraries,  but  there
  483.         are  still  separate  versions  of  library  routines  for each
  484.         installed memory model.  (Mixing memory models  and  even  more
  485.         exotic  options  are possible, but such advanced topics are not
  486.         covered here.)
  487.  
  488.              For example, memcpy() will expect both  pointer  arguments
  489.         to  be  either  near  or  far pointers, according to the memory
  490.         model in use.  If it is necessary  to  use  a  far  pointer  to
  491.         reference  a  block  of  memory to be copied in a program which
  492.         otherwise uses near pointers an alternative must  be  provided,
  493.         either  in  line  or  by a specially written function which has
  494.         different name.  The  coding  example  in  Listing  1  shows  a
  495.         simple but  realistic  case  in  which  this is necessary.  The
  496.         function  cmdargs()  needs  to  build  a  far  pointer  to  the
  497.         unparsed  command  line arguments in the program segment prefix
  498.         and use this to copy the argument string to a  buffer  supplied
  499.         by the  calling  program.  If the source code is compiled using
  500.         the small or medium memory model memcpy() cannot be used.    In
  501.         that case  in  line  code is selected.  The decision is made at
  502.         compile  time  by  testing  the  preprocessor  variables  which
  503.         identify the  memory  model.   Since the symbol which tells the
  504.         preprocessor that the compact, large, or huge model is  in  use
  505.         is  only  defined when using MSC the version with in line code,
  506.         which will actually work with any memory model is  the  default
  507.         (the #else case.)
  508.  
  509.         2. GUIDELINES FOR MEMORY MODEL SELECTION
  510.  
  511.              Many  C  programmers  find the selection of memory model a
  512.         confusing or even mysterious issue.  The  default  small  model
  513.  
  514.  
  515.  
  516.  
  517.  
  518.                                     Page  8
  519.  
  520.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  521.  
  522.  
  523.         is  sufficient  most  of  the  time,  so  beginners can put off
  524.         having to consider memory models at all.   But  there  comes  a
  525.         time  as  programs  and/or the quantity of data grow that other
  526.         models are necessary.  Rather than take the  coward's  way  out
  527.         and  simply  resort  to using large or huge all the time, which
  528.         some have done, the wise programmer should understand  all  the
  529.         issues and pick the best memory model for the job.
  530.  
  531.              Even   in   this   age  of  cheap  hardware  and  abundant
  532.         resources, it may makes sense to make the best choice  you  can
  533.         to minimize  the  use  of  resources.  A smaller .EXE file will
  534.         obviously load faster, and  for  many  programs  load  time  is
  535.         significant,  especially  if  you  are  loading  from  a floppy
  536.         disk.  Also, with 360K floppies  keeping  the  .EXE  file  size
  537.         down  may  make  the  difference between being able to keep the
  538.         program and data all on one floppy.  Looking at it yet  another
  539.         way,  it  may  make  the difference between being able to put a
  540.         frequently used program in a RAM disk or having to load from  a
  541.         hard disk  or  worse yet a floppy.  And needless to say, if you
  542.         want to either make your program resident or shell to DOS  from
  543.         it it  is  worthwhile to conserve both code and data space.  If
  544.         nothing else, keeping the code size down leaves more  room  for
  545.         data, and you never know when you may need it.
  546.  
  547.              Most  of  the time, the choice comes down to selecting the
  548.         model which the program requires.  The  main  purpose  of  this
  549.         article  is  to  help users avoid erring on the side of caution
  550.         by automatically going to the large model as soon as  they  run
  551.         out of space with small.
  552.  
  553.              Rarely,  performance  considerations  may  be so important
  554.         that  an  advance  determination  of  program  design   for   a
  555.         particular  model  is  worthwhile,  and in that case it is even
  556.         more  important  to  have  a  good  idea  of  the  trade   offs
  557.         involved.
  558.  
  559.         2.1 Determining the Minimum Model Required
  560.  
  561.              Assuming  you  are  not willing to design a program around
  562.         the  choice  of  memory  model,  the  problem  comes  down   to
  563.         selecting  a  memory  model  for  a  program  which  is already
  564.         designed and possibly coded.  As noted in 1.2, the best  choice
  565.         is the one which uses the smallest pointers which will do.
  566.  
  567.         2.1.1 Code Pointer Requirements
  568.  
  569.              The  size  of  code  pointer required is easy to determine
  570.         and may constrain the choice of memory model.   If  a  program,
  571.         counting  all library functions will fit in 64K or less of code
  572.         space, use  the  small  or  compact  model,  otherwise  medium,
  573.         large, or huge.
  574.  
  575.              The  code  part  of  most  small programs obviously fit in
  576.         64K.  For extremely large  programs  it  may  obviously  exceed
  577.         that.   For  anything in between the decision is less clear and
  578.  
  579.  
  580.  
  581.  
  582.  
  583.                                     Page  9
  584.  
  585.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  586.  
  587.  
  588.         extremely difficult to estimate.  Fortunately, the decision  is
  589.         always  a  clear  go  or  no  go  and the linker will tell you.
  590.         Unless the program  is  very  big,  it  is  best  to  start  by
  591.         compiling all  functions  using the small or compact model.  If
  592.         the 64K limit is exceeded the linker will give  a  clear  error
  593.         message.   (If  you ever exceed 64K in a single source file the
  594.         compiler would catch that, but shame on you.  Modularize!)
  595.  
  596.              Since few if any functions need to  be  coded  differently
  597.         to  switch to one of the larger models the chances are that all
  598.         you will be required to do when and if you  find  it  necessary
  599.         will  be  to  recompile  all  functions using one of the larger
  600.         models and relink.  If you have a make  file  for  the  project
  601.         that should be simple indeed.
  602.  
  603.              In  those  rare  instances where it is necessary to modify
  604.         source code according to memory model, consider coding so  that
  605.         you can   compile  using  any  memory  model.    It  is  almost
  606.         inconceivable that  the  size  of  the  code  pointer  will  be
  607.         critical  in  the  source program, so there are really only two
  608.         cases to consider, near and far data pointers.
  609.  
  610.              With MSC coding for both possibilities is easy because  an
  611.         automatically    defined    preprocessor   symbol   tells   the
  612.         preprocessor which model is being used, and this  can  be  used
  613.         with  the  #if directive to select between alternative versions
  614.         of the affected parts of  the  source  code.    The  symbol  is
  615.         M_I86xM,  where  "x"  is  the  one  character identifier of the
  616.         model in use:  M_I86SM for small, M_I86MM for  medium,  M_I86CM
  617.         for compact,  M_I86LM for large, and M_I86HM for huge.  For all
  618.         models except huge the symbol for the corresponding model  will
  619.         be defined  and  all others being undefined.  Huge is a special
  620.         case,  where  both  M_I86HM  (as  expected)  and  M_I86LM   are
  621.         defined.   Perhaps  this  is  because  the  huge  model  is  an
  622.         extension of the large model.
  623.  
  624.              Listing 1 shows a simple but realistic  case  where  these
  625.         symbols  are  used  to  select  code  based  on  memory  model.
  626.         Listing 2 is a little more contrived, selecting only  a  string
  627.         to be  displayed,  but  it checks all models.  Note that if the
  628.         difference between large and huge makes  a  difference  at  the
  629.         source  code  level  you must not conclude that the large model
  630.         is the one in use just because M_I86LM is defined.    It  could
  631.         be  that  M_I86HM  is also defined, indicating huge. That's why
  632.         the code in Listing 2 checks M_I86HM before M_I86LM.
  633.  
  634.              The amount of code is fixed.  If you are  able  to  get  a
  635.         clean  link  you  never  need  worry that a decision to use the
  636.         small or compact model will come back to haunt  you,  and  your
  637.         resulting  .EXE  file  will be smaller, sometimes much smaller.
  638.         Jerry Zeisler, who helped in the preparation  of  this  article
  639.         by  compiling  and  linking  the  bench  mark using Turbo C 1.5
  640.         reported that when he was forced to go from the  small  to  the
  641.         large  model  for  a  program  the  .EXE  file went from 71K to
  642.         161K.   Using  either  medium  or  compact  according  to   the
  643.  
  644.  
  645.  
  646.  
  647.  
  648.                                     Page  10
  649.  
  650.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  651.  
  652.  
  653.         requirements  would  have  made  the  jump less drastic, but it
  654.         does go to shown that once you cross the  line  from  small  to
  655.         another model you do pay a price in space.
  656.  
  657.         2.1.2 Data Pointer Requirements
  658.  
  659.              Finding  the  size  of  data  pointer  required  is not as
  660.         clear-cut as determining whether or not  a  near  code  pointer
  661.         will suffice.    The amount of a storage a program will need at
  662.         run time cannot be determined in advance  by  the  compiler  or
  663.         linker in  every  case.    Since  C  is a semi block structured
  664.         language automatic variables are allocated on block entry,  and
  665.         the  total  required  varies  with the depth and order of block
  666.         entries.  This does not depend only upon the  static  structure
  667.         of your  program.    It may also depend upon the data each time
  668.         you run it.  Sometimes you can arrive at a maximum, but  for  a
  669.         program  of  any  complexity  it  would  be a tedious and error
  670.         prone process requiring a lot of  knowledge  of  your  compiler
  671.         implementation.   If the program uses recursion it may not even
  672.         be possible.
  673.  
  674.              Even  when  there  is   no   recursion   the   uncertainty
  675.         concerning  data  space  requirements  may  be  a  problem in a
  676.         program which allocates heap storage using malloc() or  similar
  677.         functions, since  this  is  even less predictable.  This puts a
  678.         greater burden on the programmer, and I don't  offer  any  hard
  679.         and fast rules here.
  680.  
  681.              If  you  can  determine  that  64K  of data will always be
  682.         sufficient try the  small  model  first,  going  to  medium  if
  683.         necessary because  of  the code size.  Otherwise use compact if
  684.         possible, going to large if the code size requires it.
  685.  
  686.              Use huge only as  a  last  resort,  as  it  is  the  least
  687.         efficient, especially  with  MSC  4.0.    You can almost always
  688.         determine ahead of time whether or not  any  single  data  item
  689.         will  exceed  64K,  so  the  choice  between  large and huge is
  690.         usually easy.
  691.  
  692.         3 MEMORY MODEL BENCHMARK
  693.  
  694.              The  benefits  of  using  the  larger  pointer  types  are
  695.         obvious, and  amount to a go/no go decision in most cases.  For
  696.         those cases where performance and/or  space  is  very  critical
  697.         and  the  choice  of  memory  model  may  affect  the design in
  698.         non-trivial ways, it is good to get an idea ahead  of  time  of
  699.         what the  costs  are  as  well.  The simple benchmark used here
  700.         was devised for such a project,  where  the  the  design  could
  701.         take  advantage  of  as  much  storage  as  possible,  but  the
  702.         performance of bitor()  and  similar  functions  was  critical,
  703.         since they would be called millions of times each.
  704.  
  705.         3.1 Bench Mark Code
  706.  
  707.              The  source  code for the very simple bench mark performed
  708.  
  709.  
  710.  
  711.  
  712.  
  713.                                     Page  11
  714.  
  715.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  716.  
  717.  
  718.         is shown in Listing 2 and Listing  3.  Listing  2  defines  the
  719.         main()  function  and  Listing  2  defines an external function
  720.         bitor(), which performs a  bitwise  or  operation  between  two
  721.         memory buffers.    The  bench  mark  measures the efficiency of
  722.         calling and executing  bitor()  under  various  memory  models,
  723.         which  was  the  problem  of  interest  for  the  project which
  724.         motivated this whole study.
  725.  
  726.              An  important   reason   for   compiling   the   functions
  727.         separately,   besides   the  fact  that  bitor()  was  actually
  728.         intended for use in other programs was that it quaranteed  that
  729.         no optimizer could could eliminate the repetitive calls.
  730.  
  731.             The  main() function accepts parameters which determine how
  732.         many times to call bitor() and the size of the buffers,  up  to
  733.         a  maximum  of  256. A two level nested loop was used simply to
  734.         avoid  using  a  long  integer  counter  for  more   than   64K
  735.         repetitions.
  736.  
  737.              Both functions  were  optimized  for  speed.   This is the
  738.         default with MSC, and was used with Turbo  C  for  consistency.
  739.         This is  usually  a  wise choice for small programs anyway.  In
  740.         this case,  the  bulk  of  the  code  comes  from  the  library
  741.         routines,  and  the  bulk  of  the execution is in the compiled
  742.         functions.  Optimizing the compiled functions for  space  would
  743.         have saved  little space, and possibly cost a lot of time.  The
  744.         usual rule should be to optimize anything seldom  executed  for
  745.         space, and anything frequently executed for time.
  746.  
  747.         3.2 Execution Time Test
  748.  
  749.              When  testing  for execution time, I used the Rexx program
  750.         shown in Listing 4 to set up and  time  the  execution  of  the
  751.         .EXE files  prepared  under  each memory model.  In every case,
  752.         the .EXE files are copied to the D:  the DOS path and is a  RAM
  753.         disk.   This virtually eliminates any variability caused by the
  754.         placement of the .EXE files on a hard  disk.    Two  tests  are
  755.         performed.
  756.  
  757.              Table  1  shows  the  time  in  seconds  when  bitor()  is
  758.         executed  300,000  times  specifying  a  length  of   0,   thus
  759.         measuring mostly  calling  overhead.    The differences between
  760.         memory models is thus  mostly  related  to  the  type  of  code
  761.         pointer.
  762.  
  763.              Table  2  shows  the  time  to execute bitor() 2,500 times
  764.         specifying a length of 256.  In that case  the  execution  time
  765.         reflects   predominantly  the  indirect  memory  references  in
  766.         bitor(), which do the real work take most of the time,  so  the
  767.         primary enfluence is the code pointer type.
  768.  
  769.              The results  are  not  surprising.  The small model is the
  770.         most efficient, followed  medium  or  compact,  depending  upon
  771.         which   test  you  look  at,  then  large,  and  finally  huge.
  772.         Further, in the first test, compact is nearly  equal  to  small
  773.  
  774.  
  775.  
  776.  
  777.  
  778.                                     Page  12
  779.  
  780.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  781.  
  782.  
  783.         and medium  nearly equal to large.  In the second this grouping
  784.         is reversed.  Medium is close to small and compact is close  to
  785.         large.  This  confirms  the  analysis  done  ahead of time.  It
  786.         also goes  to  show  again  that  the  relative  importance  of
  787.         different  factors  affecting performance depends upon not only
  788.         the specific program, but sometimes  the  parameters  or  other
  789.         data as well.
  790.  
  791.              One  thing  which  is surprising at first is that although
  792.         MSC 4.0 and 5.0 are generally quite close, 4.0 shows a  (pardon
  793.         the  pun)  huge  penalty for using the huge model in the second
  794.         test.  This is probably  because  the  huge  model  was  a  new
  795.         feature  with  that  release,  and by the time release 5.0 came
  796.         out developers had had more chance to optimize it.
  797.  
  798.         3.3 Code Size Compared.
  799.  
  800.              Table 3  lists  the  size  of  the  .OBJ  and  .EXE  files
  801.         produced by  each  compiler  with each memory model.  The files
  802.         have  been  renamed  according  to  their   respective   memory
  803.         models.  The  results are mostly self explanatory.  The size of
  804.         the .EXE files must be taken with  a  half  a  grain  of  salt,
  805.         since  they  consist  mostly of library routines, which may not
  806.         have even been written in C, and don't  necessarily  shown  the
  807.         quality of the compiler.
  808.  
  809.         3.4 Conclusions
  810.  
  811.              For  each  compiler, the time and code space efficiency of
  812.         the various memory models compare to  one  another  exactly  as
  813.         our theoretical  explanation  predicts.  That is that the small
  814.         model is the most efficient and should be used in  those  cases
  815.         where it   will  serve  the  purpose.    These  tests  show  no
  816.         advantage of the tiny model over the small model.
  817.  
  818.              Medium and compact are both between small and  large,  but
  819.         can't be  strictly  ordered.   The relative effeciency of these
  820.         two depends upon the individual  program  and  data.    In  any
  821.         case,  the  programmer  is seldom faced with the choice between
  822.         medium and compact.
  823.  
  824.              The large model is less efficient than small,  medium,  or
  825.         compact,  though the difference between it and either medium or
  826.         compact may not be  significant.    When  far  code  references
  827.         predominate  medium  is  close to large and compact is close to
  828.         small.  When  data  references  predominate  the  situation  is
  829.         reversed.  The latter case is the most common in practice.
  830.  
  831.              The huge  model  is  the least efficient.  The penalty for
  832.         going from large to huge is quite severe  with  MSC  4.0,  less
  833.         with  5.0, and almost insignificant for Turbo C, a real tribute
  834.         to the optimization of Turbo C.
  835.  
  836.              Caution is always in  order  when  using  bench  marks  to
  837.         compare   different   vendor's   program  products,  especially
  838.  
  839.  
  840.  
  841.  
  842.  
  843.                                     Page  13
  844.  
  845.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  846.  
  847.  
  848.         compilers.  It is often easy to devise a  test  to  make  one's
  849.         choice come  out  on  top.    Contradictory  advertising claims
  850.         suggest this is in fact what vendors do.  The bench mark  shown
  851.         here  is  highly  selective, in that it aims to isolate certain
  852.         features of interest.  It  does  not  use  any  floating  point
  853.         operations,  recursion,  or  complex  calculations of any kind,
  854.         and does not do any significant amount  of  i/o,  for  example.
  855.         Still,  it does measure the things of interest here rather well
  856.         and was not  written  with  the  purpose  of  proving  a  given
  857.         compiler better or worse.
  858.  
  859.              It  is  therefore  worth  noting, without drawing dogmatic
  860.         conclusions, that, contrary to the  claims  of  Microsoft  when
  861.         pushing  upgrades to 5.0, version 4.0 sometimes produces better
  862.         object code.  In fact, for actual applications, I  have  hardly
  863.         ever  found  a  case  where  recompiling something with MSC 5.0
  864.         yielded a smaller or significantly  faster  .EXE  file  than  I
  865.         previously had gotten from 4.0.
  866.  
  867.              MSC  5.0  introduced  a  lot  of new functions, but if you
  868.         don't need them and are not using the huge  model  you  may  do
  869.         better to  continue  using  4.0.  I have also found version 4.0
  870.         to be  a  much  more  reliable  product.    I  only  report  my
  871.         experience.   Perhaps  my  applications are not representative.
  872.         I never use  floating  point  math  but  use  recursion  fairly
  873.         often, for example.
  874.  
  875.              So  many bugs were reported with 5.0 that Microsoft rather
  876.         quickly announced 5.1.  I did not have 5.1 available  for  test
  877.         because  I  had  such  a  bad experience with 5.0 that I didn't
  878.         feel like  paying  another  upgrade  fee  to  fix  their  bugs,
  879.         preferring  to  spend  about the same amount of money for Turbo
  880.         C, if it came to that.  The results of this limited bench  mark
  881.         seems to  strengthen  that  resolve.    In  every case, Turbo C
  882.         produced tighter,  faster  object  code,  a  rather  impressive
  883.         achievement considering the price differential.
  884.  
  885.  
  886.  
  887.  
  888.  
  889.  
  890.  
  891.  
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.  
  900.  
  901.  
  902.  
  903.  
  904.  
  905.  
  906.  
  907.  
  908.                                     Page  14
  909.  
  910.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  911.  
  912.  
  913.         =================================================================
  914.     /* Listing 1: CMDARGS.C */
  915.         /* get unparsed command line arguments from PSP */
  916.         /* sets input variable to the line and returns length */
  917.         #include <stdlib.h>
  918.         #include <string.h>
  919.         #include <dos.h>
  920.         #define FP_PTR(seg,off) ((((long)seg)<<16)+off)
  921.  
  922.         int cmdargs(result) char *result;
  923.         {
  924.         unsigned char far *dta=FP_PTR(_psp,0x80);
  925.         /* if compact, large or huge use memcpy */
  926.         #if defined(M_I86LM) || defined(M_I86CM)
  927.         memcpy(result,dta+1,*dta);
  928.         result[*dta]=0;
  929.         return *dta;
  930.         #else
  931.         {
  932.         int length=*dta;
  933.         int ret_len=length;
  934.         while (length--)
  935.         *(result++)=*(dta++);
  936.         *result=0;
  937.         return ret_len;
  938.         }
  939.         #endif
  940.         }
  941.  
  942.         #if defined(TEST)
  943.         #include <stdio.h>
  944.         main()
  945.         {
  946.         char args[128];
  947.         cmdargs(args);
  948.         putchar('"');
  949.         fputs(args,stdout);
  950.         putchar('"');
  951.         }
  952.         #endif
  953.  
  954.  
  955.  
  956.  
  957.  
  958.  
  959.  
  960.  
  961.  
  962.  
  963.  
  964.  
  965.  
  966.  
  967.  
  968.  
  969.  
  970.                                     Page  15
  971.  
  972.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  973.  
  974.  
  975.         =================================================================
  976.  
  977.     /* LISTING 2 - TEST.C */
  978.         #include <stdio.h>
  979.         void bitor(char *, char *, int);
  980.         /* Use preprocessor symbols to determine
  981.         content of string model[] */
  982.         static char model[8]=
  983.         #if defined(M_I86SM)
  984.         "small";
  985.         #elif defined(M_I86MM)
  986.         "medium";
  987.         #elif defined(M_I86CM)
  988.         "compact";
  989.         #elif defined(M_I86HM)
  990.         /* NOTE huge must be tested before large,
  991.            because huge sets M_I86LM as well as M_I86HM */
  992.         "huge";
  993.         #elif defined(M_I86LM)
  994.         "large";
  995.         #else
  996.         "unknown"; /* non-standard, (or Turbo C) */
  997.         #endif
  998.         main(argc, argv) int argc; char **argv;
  999.         {
  1000.         char buf1[256], buf2[256];
  1001.         int i=0, j, jlim=0, len=sizeof(buf1);
  1002.         /* i=outer loop count; j=inner loop count; defaults 0 0 */
  1003.         switch (argc)
  1004.         {
  1005.         case 4:
  1006.         len=atoi(argv[3]);
  1007.            if (len>sizeof(buf1)) len=sizeof(buf1);
  1008.         case 3:
  1009.            jlim=atoi(argv[2]);
  1010.         case 2:
  1011.            i=atoi(argv[1]);
  1012.         }
  1013.         printf("model=%s i=%d j=%d len=%d\n",model,i,jlim,len);
  1014.         while (i--)
  1015.            for (j=jlim; j; j--)
  1016.            bitor(buf1,buf2,len);
  1017.         }
  1018.  
  1019.  
  1020.  
  1021.  
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.                                     Page  16
  1034.  
  1035.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  1036.  
  1037.  
  1038.         =================================================================
  1039.  
  1040.         /* LISTING 3 - BITOR.C */
  1041.         /* Perform bitwise or between two buffers */
  1042.         void bitor(x,y,len) char *x, *y; int len;
  1043.         {while (len--) *(x++)|=*(y++);}
  1044.  
  1045.         =================================================================
  1046.  
  1047.         /* Listing 4: TIMETEST.REX */
  1048.         source='MSC4 MSC5 TURBOC'
  1049.         parms.1=10 30000 0
  1050.         parms.2=1 2500 256
  1051.         models='S M C L H' /* Tiny model tested separately */
  1052.  
  1053.         do ii=2 to words(source)
  1054.         s=word(source,ii)
  1055.         copy '\'s'\*.exe d:'
  1056.         outfile=s'.DAT'
  1057.         do j=1 to 2
  1058.         do i=1 to words(models)
  1059.             m=word(models,i)
  1060.         /* Here is the key part: Execute and record time */
  1061.           call time r
  1062.            'TEST'm parms.j
  1063.               time.j.m=time(e)
  1064.             end
  1065.         end
  1066.         do i=1 to words(models)
  1067.         m=word(models,i)
  1068.            data=m time.1.m time.2.m
  1069.              say data
  1070.                call lineout outfile, data
  1071.            end
  1072.         end
  1073.         exit
  1074.  
  1075.  
  1076.         
  1077.  
  1078.  
  1079.  
  1080.  
  1081.  
  1082.  
  1083.  
  1084.  
  1085.  
  1086.  
  1087.  
  1088.  
  1089.  
  1090.  
  1091.  
  1092.  
  1093.  
  1094.  
  1095.  
  1096.                                     Page  17
  1097.  
  1098.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  1099.  
  1100.  
  1101.         =================================================================
  1102.  
  1103.         Table 1: Speed Test - Function Calls
  1104.  
  1105.         Model    MSC 4.0   MSC 5.0   Turbo C 1.5
  1106.         -------  -------   -------   -----------
  1107.          Tiny                         25.10
  1108.          Small    35.32     34.27     25.10
  1109.          Medium   42.13     41.58     27.30
  1110.          Compact  35.54     34.43     21.42
  1111.          Large    42.29     41.63     23.07
  1112.          Huge     43.88     41.63     25.98
  1113.  
  1114.         =================================================================
  1115.  
  1116.         Table 2: Speed Test - Indirect Byte Reference
  1117.  
  1118.         Model    MSC 4.0   MSC 5.0   Turbo C 1.5
  1119.         -------  -------   -------   -----------
  1120.          Tiny                         18.89
  1121.          Small    32.19     32.19     18.90
  1122.          Medium   32.29     32.24     18.95
  1123.          Compact  35.92     35.86     30.92
  1124.          Large    35.98     35.93     30.98
  1125.          Huge     68.88     41.19     31.03
  1126.  
  1127.  
  1128.  
  1129.  
  1130.  
  1131.  
  1132.  
  1133.  
  1134.  
  1135.  
  1136.  
  1137.  
  1138.  
  1139.  
  1140.  
  1141.  
  1142.  
  1143.  
  1144.  
  1145.  
  1146.  
  1147.  
  1148.  
  1149.  
  1150.  
  1151.  
  1152.  
  1153.  
  1154.  
  1155.  
  1156.  
  1157.  
  1158.  
  1159.  
  1160.  
  1161.                                     Page  18
  1162.  
  1163.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  1164.  
  1165.  
  1166.         =================================================================
  1167.     Table 3 - Comparing .OBJ and .EXE File Size
  1168.                        MSC     MSC  Turbo C
  1169.         File           4.0     4.0   1.5
  1170.         -----------
  1171.         bitort.obj       *       *   194
  1172.         bitors.obj     309     287   192
  1173.         bitorm.obj     316     294   197
  1174.         bitorc.obj     309     285   196
  1175.         bitorl.obj     316     292   201
  1176.         bitorh.obj     381     326   182
  1177.  
  1178.         testt.obj        *       *   473
  1179.         tests.obj      541     521   473
  1180.         testm.obj      557     537   487
  1181.         testc.obj      560     541   495
  1182.         testl.obj      576     557   509
  1183.         testh.obj      653     636   485
  1184.  
  1185.         testt.exe        *       *  6534
  1186.         tests.exe     6670    7383  6334
  1187.         testm.exe     6870    7531  6476
  1188.         testc.exe     8770    9501  7898
  1189.         testl.exe     8970    9649  8056
  1190.         testh.exe     9082    9729  9143
  1191.  
  1192.         * Tiny model not applicable to MSC.
  1193.  
  1194.  
  1195.  
  1196.  
  1197.  
  1198.  
  1199.  
  1200.  
  1201.  
  1202.  
  1203.  
  1204.  
  1205.  
  1206.  
  1207.  
  1208.  
  1209.  
  1210.  
  1211.  
  1212.  
  1213.  
  1214.  
  1215.  
  1216.  
  1217.  
  1218.  
  1219.  
  1220.  
  1221.  
  1222.  
  1223.  
  1224.  
  1225.  
  1226.                                     Page  19
  1227.  
  1228.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  1229.  
  1230.  
  1231.         Public Domain Software Review:  ROFF By Barry Lynch
  1232.  
  1233.         Program:  ROFF4.ARC
  1234.         Purpose:   A MS-DOS implementation of ROFF a UNIX utility. 
  1235.                    Provides document formatting and typsetting.
  1236.  
  1237.             A friend of mine suggested that I use  ROFF  to  produce  C
  1238.         News.   Previously  I  had  mentioned  the hassle involved with
  1239.         generating each edition of C News.  So, I picked up a  copy  of
  1240.         ROFF4 and tried it out.
  1241.  
  1242.              This   edition  of  ROFF4  is  a  1984  version  that  was
  1243.         originally written by Ernest bergmann of Lehigh University.   C
  1244.         source  code  is provided as well as 19 pages of documentation.
  1245.         This issue of C News was generated  with  this  package.    The
  1246.         output  is  excellent and the utility is fairly easy to use, if
  1247.         you read the documentation carefully.
  1248.  
  1249.              However,  there  are  some  problems  that  need   to   be
  1250.         addressed.  One  is  the  documentation.    It does not clearly
  1251.         spell out the functionality of each option.  I  had  difficulty
  1252.         getting  certain lines NOT to right justify, even after putting
  1253.         a non-right justify flag in place.  Also, the src code  example
  1254.         included with  one  of  the articles was mangled.  I had to cut
  1255.         and paste a new version of src in.
  1256.  
  1257.              All in all this is not a bad utility.  The  problems  that
  1258.         I experienced  could  be to my unfamiliarity with ROFF.  I will
  1259.         be spending the next couple of weeks working with  it  to  make
  1260.         sure that  it  can indeed do the job I need it to do.  Which is
  1261.         create C News automatically.
  1262.  
  1263.         * Editor's Note:  I will be working on enhanceing this product
  1264.                           in the coming months.     Specifically adding
  1265.                           on-line help and cleaning up the documentation
  1266.                           with examples.
  1267.  
  1268.  
  1269.  
  1270.  
  1271.  
  1272.  
  1273.  
  1274.  
  1275.  
  1276.  
  1277.  
  1278.  
  1279.  
  1280.  
  1281.  
  1282.  
  1283.  
  1284.  
  1285.  
  1286.  
  1287.  
  1288.                                     Page  20
  1289.  
  1290.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  1291.  
  1292.  
  1293.         FILECHK version 1.0 by Arnold Cherdak, all rights reserved
  1294.  
  1295.         Disk File Integrity Checker:  Reads all files on a disk  or  in
  1296.         one  or  more  (sub)directories  to  verify  that the directory
  1297.         entry for each file is correct and that the file is readable.
  1298.  
  1299.         Usage:  FILECHK [-D] [-H] [-?] [directoryname]
  1300.         
  1301.         Default  operation  (without  command  line  entries)  causes
  1302.         FILECHK to read all files in the current directory and all files
  1303.         in subdirectories below the current directory.
  1304.  
  1305.           -D  option  causes  FILECHK  to  process files in the current
  1306.         directory,
  1307.           only.
  1308.  
  1309.           -H and -?  options provide the help screen (this one).
  1310.  
  1311.           The presence of a string, 'directoryname', causes FILECHK  to
  1312.         begin processing in    the    directory    having    the   name,
  1313.         'directoryname'.
  1314.  
  1315.  
  1316.           This program was written in response to a friend's  plea  for
  1317.         help.    He  runs  several  PC  networks  which  have  been  in
  1318.         operation for quite  some  time.    Occasionally,  one  of  his
  1319.         installations receives  a  near  hit by lightning.  Needless to
  1320.         say, this scrambles the computers' brains and creates  problems
  1321.         which  don't  show  up  right  away  in  addition to those that
  1322.         announce themselves with furious noises and  billows  of  smoke
  1323.         -- surge protectors, notwithstanding.
  1324.  
  1325.           FILECHK  reads all the files on the disk or in a directory or
  1326.         a directory and its subdirectories.  If the files can  be  read
  1327.         and  the  size  as  read  agrees with the directory entry, then
  1328.         it's a pretty good bet that the file is  usable.    Friend  had
  1329.         several  cases where directories were OK and the files had been
  1330.         clobbered and effects  on  network  operation  weren't  readily
  1331.         discernable all  the time.  After much searching among HUNDREDS
  1332.         of files, he finally found the few bad  files.    FILECHK  will
  1333.         now  do  it  for  him faster and more completely than he can do
  1334.         it.
  1335.  
  1336.           If you want a record of FILECHK's output,  you  may  redirect
  1337.         it  to  your  printer  or  to  a  file  using  the  normal  DOS
  1338.         redirection since all output goes to stdout.  Example:
  1339.                                    FILECHK -d
  1340.                              or FILECHK -D utilities >prn
  1341.  
  1342.           I've included the source code in Turbo C,  version  1.5.    I
  1343.         began  to  do  this  since  the  virus problem became so acute.
  1344.         With the source, you can compile the program  yourself  and  be
  1345.         certain  that  there will be no surprises in store for you when
  1346.  
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352.                                     Page  21
  1353.  
  1354.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  1355.  
  1356.  
  1357.         you run it.  I've run FILECHK in the root directory  of  my  30
  1358.         megabyte drive  in my own computer.  It read over 25 megabytes,
  1359.         about 1600 files in a veritable rat's  nest  of  subdirectories
  1360.         in about  5  minutes.  It would be a bit faster when writing to
  1361.         a file, a bit slower when writing  to  the  printer.    FILECHK
  1362.         found no  problems.    I  ran  CHKDSK to compare and it found 3
  1363.         lost clusters.  In the past,  I've  found  that  lost  clusters
  1364.         don't always  mean that the files are lost.  In fact, I've been
  1365.         able to make the lost clusters disappear by  moving  files  off
  1366.         or around   the   disk.     The  files  copied  all  right  and
  1367.         afterwards, CHKDSK could find nothing  wrong.    Stranger  than
  1368.         fiction.
  1369.                                           Arnie Cherdak
  1370.                                              8/14/88
  1371.  
  1372.  
  1373.  
  1374.  
  1375.  
  1376.  
  1377.  
  1378.  
  1379.  
  1380.  
  1381.  
  1382.  
  1383.  
  1384.  
  1385.  
  1386.  
  1387.  
  1388.  
  1389.  
  1390.  
  1391.  
  1392.  
  1393.  
  1394.  
  1395.  
  1396.  
  1397.  
  1398.  
  1399.  
  1400.  
  1401.  
  1402.  
  1403.  
  1404.  
  1405.  
  1406.  
  1407.  
  1408.  
  1409.  
  1410.  
  1411.  
  1412.  
  1413.  
  1414.  
  1415.  
  1416.                                     Page  22
  1417.  
  1418.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  1419.  
  1420.  
  1421.         ARTICLE SUBMISSION STANDARDS AND ADDRESSES
  1422.  
  1423.  
  1424.             As   I  have  repeatedly  stated  in  this  newsletter  and
  1425.         previous issues, I would like to see  user-submitted  articles,
  1426.         reviews or  questions.    Listed  below  are the standards that
  1427.         should be followed to make my job easier as an editor.
  1428.  
  1429.  
  1430.              - Articles should be submitted in a ASCII non-formatted
  1431.                file.  (Margins 0-65 PLEASE)
  1432.  
  1433.              - If the article include code fragments as examples. Then
  1434.                you can include the entire source file if you like for
  1435.                inclusion with the newsletter.
  1436.  
  1437.              - Book or magazine reviews should follow the same format,
  1438.                that is outlined in this issue.  The publisher, author,
  1439.                title, and ISBN number are a must.
  1440.  
  1441.              - Compiler/and or product reviews, should include the
  1442.                version number and manufacture.  If possible, reviews
  1443.                should include a sample program with benchmarks.
  1444.  
  1445.  
  1446.                If you have any questions you  can  contact  me  at  the
  1447.         address's included on the next page.
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455.  
  1456.  
  1457.  
  1458.  
  1459.  
  1460.  
  1461.  
  1462.  
  1463.  
  1464.  
  1465.  
  1466.  
  1467.  
  1468.  
  1469.  
  1470.  
  1471.  
  1472.  
  1473.  
  1474.  
  1475.  
  1476.  
  1477.  
  1478.  
  1479.  
  1480.  
  1481.                                     Page  23
  1482.  
  1483.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  1484.  
  1485.  
  1486.         ADDRESSES
  1487.  
  1488.                     The C BBS is located at:
  1489.  
  1490.                       C BBS
  1491.                       % BCL Limited
  1492.                       P.O. Box 9162
  1493.                       McLean VA, 22102
  1494.  
  1495.  
  1496.                     or you can send netmail to:
  1497.  
  1498.  
  1499.                     1:109/713
  1500.  
  1501.  
  1502.  
  1503.  
  1504.  
  1505.  
  1506.  
  1507.  
  1508.  
  1509.  
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515.  
  1516.  
  1517.  
  1518.  
  1519.  
  1520.  
  1521.  
  1522.  
  1523.  
  1524.  
  1525.  
  1526.  
  1527.  
  1528.  
  1529.  
  1530.  
  1531.  
  1532.  
  1533.  
  1534.  
  1535.  
  1536.  
  1537.  
  1538.  
  1539.  
  1540.  
  1541.  
  1542.  
  1543.  
  1544.  
  1545.  
  1546.                                     Page  24
  1547.  
  1548.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  1549.  
  1550.  
  1551.                              INDEX
  1552.  
  1553.               Subject:                                       Issue:
  1554.  
  1555.               Articles:
  1556.  
  1557.               Additional Comments of Filename Wild..            6
  1558.               Beginning C Functions                             7
  1559.               C Spot Run:  A User Supported Library             7
  1560.               Database Design in C                             10
  1561.               Filechk                                          11
  1562.               Filename Wildcard Expansion in MSC                4
  1563.               Integrated Environment:  TC & QC                  5
  1564.               Memory Models                                    11
  1565.               Programming the Hercules Graphics Card            8
  1566.               Programming the Hercules Graphics Card: Part 2    9
  1567.               Talking with a Fossil                             5
  1568.               TurboC and Interrupts:  A few Questions           2
  1569.  
  1570.               Book Reviews:
  1571.  
  1572.               C Chest:  and other treasures.                    6
  1573.               C Database Development                            1
  1574.               C Programming Guide                               1
  1575.               C Programming Language                            1
  1576.               C Programmer's Guide to Serial Communications     3
  1577.               C Programmer's Library                            1
  1578.               C Primer Plus                                     1
  1579.               C the Complete Reference                          2
  1580.               Crafting C Tools for the IBM PC                   2
  1581.               Learning to Program in C                          1
  1582.               Microsoft C Programming on the IBM PC             1
  1583.               MS-DOS Developer's Guide                          4
  1584.               Programming in Windows                            3
  1585.               QuickC Programming for the IBM                   10
  1586.               Reliable Data Structures in C                     1
  1587.               TurboC:  Memory Resident Utilities                5
  1588.               TurboC Programmer's Reference Book                2
  1589.  
  1590.  
  1591.               Compilers:
  1592.  
  1593.               QuickC                                            1
  1594.  
  1595.               Software Reviews:
  1596.  
  1597.               Bplus11.arc                                       3
  1598.               C_Dates.arc                                       4
  1599.               Cdate.arc                                         4
  1600.               Casm.arc                                          3
  1601.               C-subr.arc                                        4
  1602.               Docu.arc                                          3
  1603.               Ezwind.arc                                        8
  1604.               Jcl-src.arc                                       4
  1605.  
  1606.  
  1607.  
  1608.  
  1609.  
  1610.                                     Page  25
  1611.  
  1612.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  1613.  
  1614.               Mscpopup.arc                                      3
  1615.               Ndmake41.arc                                      4
  1616.               Nuc-subr.arc                                      3
  1617.               Prndoc.arc                                        6
  1618.               Sed.arc                                           6
  1619.               Shift_c.arc                                       4
  1620.               Sysact11.arc                                      4
  1621.               Tp_to_qc.arc                                      3
  1622.               Xenixarc.arc                                      4
  1623.  
  1624.  
  1625.  
  1626.  
  1627.  
  1628.  
  1629.  
  1630.  
  1631.  
  1632.  
  1633.  
  1634.  
  1635.  
  1636.  
  1637.  
  1638.  
  1639.  
  1640.  
  1641.  
  1642.  
  1643.  
  1644.  
  1645.  
  1646.  
  1647.  
  1648.  
  1649.  
  1650.  
  1651.  
  1652.  
  1653.  
  1654.  
  1655.  
  1656.  
  1657.  
  1658.  
  1659.  
  1660.  
  1661.  
  1662.  
  1663.  
  1664.  
  1665.  
  1666.  
  1667.  
  1668.  
  1669.  
  1670.  
  1671.  
  1672.  
  1673.                                     Page  26
  1674.  
  1675.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  1676.  
  1677.                             DISTRIBUTION POINTS   
  1678.    
  1679.    
  1680.       Board Name               Number         Net/Node       Sysop   
  1681.    
  1682.       United States   
  1683.    
  1684.       C BBS               (703) 644-6478      1:109/713      Barry Lynch   
  1685.       Burke, VA   
  1686.    
  1687.       Jaz C-Scape         (904) 724-1377      1:112/1027     Tom Evans   
  1688.       Jacksonville, FL   
  1689.  
  1690.    
  1691.       Eastern C Board     (201) 247-6748      1:107/335      Todd Lehr   
  1692.    
  1693.       OTHER BOARDS THAT CARRY C NEWS:
  1694.  
  1695.       Exec-PC             (414) 964-5160        ..           Bob Mahoney
  1696.       Milwaukee, WI
  1697.  
  1698.       TAMIAMI             (813) 793-2392                     Gerhard Barth
  1699.       Naples, FL
  1700.        
  1701.       Sound of Music      (516) 536-8723(2400)               Paul Waldinger
  1702.                           (516) 536-6819(9600 Hayes V)   
  1703.    
  1704.       Canada   
  1705.    
  1706.       Another BBS System  (416) 465-7752      1:148/208      Mark Bowman   
  1707.       Toronto, Canada   
  1708.    
  1709.       Europe   
  1710.    
  1711.       Fido_N1_1               31-8350-37156     2:500/1        Henk Wevers 
  1712.  
  1713.       The Netherlands   
  1714.    
  1715.       Australia   
  1716.    
  1717.       Sentry BBS              02-428-4687       ...            Trev Roydhouse
  1718.             (300-2400) Non-Mail Times
  1719.             (300-19,200) Mail Hour (Trailblazer) 
  1720.  
  1721.            The Sentry BBS replaces Alpha-Centuri that has been down for
  1722.       awhile.   
  1723.  
  1724.  
  1725.  
  1726.  
  1727.  
  1728.  
  1729.  
  1730.  
  1731.  
  1732.  
  1733.    
  1734.                                     Page  27
  1735.  
  1736.         C News  Vol. 1  Issue 11                         Sept 15, 1988
  1737.  
  1738.         USER RESPONSE FORM 
  1739.    
  1740.             This form will be included as a regular feature in all future   
  1741.         issues of C NEWS.   
  1742.    
  1743.    
  1744.    
  1745.         What did you think of the content of this Issue?  _____________   
  1746.         
  1747.         _______________________________________________________________   
  1748.         
  1749.         What improvements can you think of that would make C News a   
  1750.         better tool for the C Community?   
  1751.    
  1752.         _______________________________________________________________   
  1753.  
  1754.         _______________________________________________________________   
  1755.    
  1756.    
  1757.         What is your favorite section or sections?  ___________________   
  1758.    
  1759.         _______________________________________________________________   
  1760.    
  1761.    
  1762.         What don't you like about C News?  ____________________________   
  1763.    
  1764.         _______________________________________________________________   
  1765.    
  1766.    
  1767.         Additional Comments:  _________________________________________   
  1768.    
  1769.         _______________________________________________________________   
  1770.    
  1771.         _______________________________________________________________   
  1772.    
  1773.         _______________________________________________________________   
  1774.  
  1775.    
  1776.                            Page  28
  1777.  
  1778.   
  1779.   
  1780.  
  1781.